# 从 sqlalchemy 导入 func 函数，用于在数据库操作中使用函数，如获取当前时间
from sqlalchemy import func
# 从 app.models 模块导入数据库实例
from app.models import db

class Ticket(db.Model):
    """
    Ticket 类代表数据库中的车票表，继承自 SQLAlchemy 的 db.Model
    """
    __tablename__: str = 'ticket'

    # 定义车票的主键，为整数类型，自动递增
    id = db.Column(db.Integer, primary_key=True)
    # 定义车票座位号，最大长度为 120 的字符串
    seat_no = db.Column(db.String(120))
    # 定义车票座位等级，最大长度为 120 的字符串
    seat_class = db.Column(db.String(120))
    # 定义车票价格，使用 Numeric 类型，总位数 8 位，小数位 2 位
    price = db.Column(db.Numeric(8, 2))
    # 定义车票状态，整数类型，默认值为 0
    state = db.Column(db.Integer, default=0)
    # 定义车次编号，关联到 train 表的 train_no 字段，不能为空，并添加索引
    train_no = db.Column(db.String(120), db.ForeignKey('train.train_no'), nullable=False, index=True)
    # 定义乘客 ID，关联到 passenger 表的 id 字段，不能为空，并添加索引
    passenger_id = db.Column(db.Integer, db.ForeignKey('passenger.id'), nullable=False, index=True)
    # 定义订单 ID，关联到 order 表的 id 字段，不能为空，并添加索引
    order_id = db.Column(db.Integer, db.ForeignKey('order.id'), nullable=False, index=True)
    # 定义出发站，最大长度为 120 的字符串
    from_station = db.Column(db.String(120))
    # 定义到达站，最大长度为 120 的字符串
    to_station = db.Column(db.String(120))
    # 定义乘车日期，最大长度为 120 的字符串
    date = db.Column(db.String(120))
    # 定义出发时间，日期时间类型
    departure_time = db.Column(db.DateTime)
    # 定义到达时间，日期时间类型
    arrival_time = db.Column(db.DateTime)
    # 定义车票记录创建时间，默认值为当前时间
    created_at = db.Column(db.DateTime, default=func.now())
    # 定义车票记录更新时间，默认值为当前时间
    updated_at = db.Column(db.DateTime, default=func.now())
    # 定义与 Order 模型的关联关系，通过 backref 可以从 Order 访问相关的车票
    order = db.relationship('Order', backref=db.backref('tickets'))
    # 定义与 Passenger 模型的关联关系，通过 backref 可以从 Passenger 访问相关的车票
    passenger = db.relationship('Passenger', backref=db.backref('tickets'))

    def __repr__(self):
        """
        返回车票对象的字符串表示形式，方便调试和日志记录
        :return: 包含车票 ID 的字符串
        """
        return f'<Ticket {self.id}>'

    def updateState(self):
        """
        更新车票的状态为 1
        :return: 更新状态后的车票对象
        """
        self.state = 1
        return self

    @classmethod
    def generateTicket(cls, item, passenger_id):
        """
        根据传入的车票信息和乘客 ID 生成一个新的车票对象
        :param item: 包含车票信息的字典，如座位等级、车次、出发站等
        :param passenger_id: 乘客的 ID
        :return: 生成的车票对象
        """
        # 创建一个新的 Ticket 对象
        ticket = Ticket(
            seat_class=item["seatClass"],
            train_no=item["trainNo"],
            from_station=item["from"],
            to_station=item["to"],
            date=item["date"],
            passenger_id=passenger_id
        )
        return ticket